package com.lesama.stream;

/*
    Stream流的中间操作方法：
        操作后返回Stream对象，可以继续操作
        Stream<T> filter(Predicate<? super T> predicate) 用于对流中数据进行过滤
        Stream<T> limit(long maxSize) 获取前几个元素
        Stream<T> skip(long n) 调过n个元素
        Stream<T> distinct() 去除流中重复的元素依赖 （hashCode 和 equals方法需要重写）
        static <T> Stream<T> concat(Stream a, Stream b) 合并a 和 b流为一个流

    注意： 如果流对象已经被消费过了，就不允许再次使用了
 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "今汐", "菲比", "椿", "弗洛洛", "卡提西亚");
        // 需求1： 取前3个数据打印
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("-----------------------------------------");
        // 需求2： 跳过3个元素，把剩下元素打印
        list.stream().skip(3).forEach(System.out::println);
        System.out.println("-----------------------------------------");
        // 需求3： 跳过2个元素，把剩下的元素中前2个打印
        list.stream().skip(2).limit(2).forEach(System.out::println);
        System.out.println("-----------------------------------------");
        // 需求4： 取前4个数据组成一个流
        Stream<String> s4 = list.stream().limit(4);
        System.out.println("-----------------------------------------");
        // 需求5： 跳过2个数据组成一个流
        Stream<String> s5 = list.stream().skip(2);
        System.out.println("-----------------------------------------");
        // 需求6： 合并需求4和需求5得到的流，并将结果输出
        // Stream.concat(s4, s5).forEach(System.out::println);
        System.out.println("-----------------------------------------");
        // 需求7： 合并需求4和需求5得到的流，并将结果输出，要求元素不重复
        Stream.concat(s4, s5).distinct().forEach(System.out::println);
        System.out.println("-----------------------------------------");
    }
}
